#ifndef TEMPORARYCODEGENERATOR_H
#define TEMPORARYCODEGENERATOR_H

#include <string>
#include <fstream>
#include <vector>
#include <stack>

class TemporaryCodeGenerator{
	long nextAddr;
	std::ofstream destFile;
	std::vector<std::string> vTC;
	std::stack<int>	ifStack;
	std::stack<int> whileStack;

public:
	TemporaryCodeGenerator(const std::string &tmpCodeFile);

	//将生成代码输出：
	void generateCode(void);

	//普适运算代码：
	void op(const std::string &opStr, 
			const std::string &resultAddr,
			const std::string &oplAddr,
			const std::string &oprAddr="****");
	void op(const std::string &opStr,
			const std::string &resultAddr,
			int val);

	void op(const std::string &opStr,
			const std::string &resultAddr,
			double val);

	//int类型到float类型的转换：
	void intToFloat(const std::string &floatAddr, 
			const std::string &intAddr);
	
	//表达式运算的代码生成方法：
	void plus(const std::string &resultAddr,/* 结果地址 */
			const std::string &oplAddr, /* 左操作数地址 */
			const std::string &oprAddr);/* 右操作数地址 */
	
	void minus(const std::string &resultAddr,
			const std::string &oplAddr,
			const std::string &oprAddr);
	
	void mul(const std::string &resultAddr,
			const std::string &oplAddr,
			const std::string &oprAddr);
	
	void div(const std::string &resultAddr,
			const std::string &oplAddr,
			const std::string &oprAddr);

	//赋值语名的代码生成方法：
	void assign(const std::string &destAddr /* 目标地址*/,
		  const std::string &srcAddr /* 源地址 */ );
	
	//if语句的代码生成方法：考虑嵌套，数据用堆栈保存
	// 遇到if(conExp)后调用，设定条件跳转，出口地址待填。
	void if_begin(const std::string &conExpValAddr /*条件表达式值的地址*/);
	void if_end(void);  //遇到if(conExp) statements;时调用，
			//将下一地址填入if_begin()的入口地址。
	void else_begin(void);//遇到if(conExp) statements else时调用，
			//先设定无条件跳转，出口地址待填，然后将下一地址
			//填入if_begin处的出口地址
	void if_else_end(void);//遇到if(conExp) statements else statements;时调用，
			//将下一地址填入if_else_begin()处的出口地址。

	//while语句的代码生成方法,考虑嵌套，应设立堆栈保存有关信息。
	void while_begin(void);//遇到while关键字时调用，用于标记 入口地址。
	void while_condition(const std::string &conExpValAddr);
				//遇到while(conExp)时调用，
				//设定条件跳转，出口地址 为空。
	void while_end();//遇到while(conExp) statements;时调用，
			//设定无条件跳转到 入口地址，并填好 出口地址。
	
	//return语句的代码生成方法：
	void return_value(const std::string &retValAddr);//有值返回语句
	void return_void(void);//无值返回语句
	//返回函数的地址：
	int func_begin(void);
	//返回main函数的地址，并设置第一条jmp指令跳到main函数执行
	int main_begin(void);
	void func_end(void);
};
		


#endif
